Skip to content

Conversation

mathieuchopstm
Copy link
Contributor

  • empty control endpoint transfer queues when SETUP is received
  • properly handle OUT control transfers with Data larger than EP0 MaxPacketSize

First commit is similar to what was introduced by #94001 - in my testing, it doesn't seem necessary, but I've included it in this patchset regardless. (I allowed myself to "cherry-pick" it as @nandojve seems unavailable)

Second commit fixes the same issue as #94001 but in a different manner that is, I believe, more solid.

Full testing TBD, but preliminary results show I have same testusb results as with #94001.

Drop all existing transfers in control endpoints' queue when a new SETUP
packet is received. Also use the appropriate net_buf API in a nearby place.

Signed-off-by: Mathieu Choplain <[email protected]>
During a Host-to-Device Control transfer, an arbitrary amount of data is
sent from Host to the Device using OUT Data packets. If the total amount of
data to transfer, communicated via the wLength field of the SETUP packet,
exceeds the EP0 MaxPacketSize, several Data packets until all data has been
transfered.

Combined with HAL behavior, the STM32 driver did not handle this situation
properly and always ended reception after a single Data packet was received
regardless of whether or not all data had actually been received from Host.

Modify driver to handle this situation properly by keeping track of how
much data has been received and restarting transfers until we have received
everything the Host promised it would send.

Signed-off-by: Mathieu Choplain <[email protected]>
Copy link

Copy link
Contributor

@etienne-lms etienne-lms left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM AFAICT.

@mathieuchopstm mathieuchopstm added this to the v4.3.0 milestone Oct 17, 2025
@mathieuchopstm
Copy link
Contributor Author

mathieuchopstm commented Oct 20, 2025

For each board, testusb -v 512 was executed at least twice. The results are as follows:

nucleo_l552ze_q

Build command: west build -b nucleo_c071rb samples/subsys/usb/testusb -DCONFIG_LOG_MODE_IMMEDIATE=y -DCONFIG_UDC_BUF_POOL_SIZE=16384 -DCONFIG_UDC_STM32_STACK_SIZE=4096 -DCONFIG_ASSERT=y -p

$ sudo ./testusb -v 512 -D /dev/bus/usb/003/018
./testusb: /dev/bus/usb/003/018 may see only control tests
full speed	/dev/bus/usb/003/018	0
running all tests
/dev/bus/usb/003/018 test 0,    0.000005 secs
/dev/bus/usb/003/018 test 1,    1.681637 secs
/dev/bus/usb/003/018 test 2,    1.350303 secs
/dev/bus/usb/003/018 test 3,    0.865792 secs
/dev/bus/usb/003/018 test 4,    0.700139 secs
/dev/bus/usb/003/018 test 5,   49.016696 secs
/dev/bus/usb/003/018 test 6,   40.257209 secs
/dev/bus/usb/003/018 test 7,   25.379816 secs
/dev/bus/usb/003/018 test 8,   20.921606 secs
/dev/bus/usb/003/018 test 9,    1.957835 secs
/dev/bus/usb/003/018 test 10,    6.802943 secs
/dev/bus/usb/003/018 test 11,    8.022888 secs
/dev/bus/usb/003/018 test 12,    8.009057 secs
/dev/bus/usb/003/018 test 13 --> 22 (error 22)
/dev/bus/usb/003/018 test 14,    1.337686 secs
/dev/bus/usb/003/018 test 17,    1.628277 secs
/dev/bus/usb/003/018 test 18,    1.430382 secs
/dev/bus/usb/003/018 test 19,    1.678913 secs
/dev/bus/usb/003/018 test 20,    1.383668 secs
/dev/bus/usb/003/018 test 21,    1.445382 secs
/dev/bus/usb/003/018 test 24,   51.675675 secs
/dev/bus/usb/003/018 test 27,   48.737332 secs
/dev/bus/usb/003/018 test 28,   40.060578 secs
/dev/bus/usb/003/018 test 29,    0.861226 secs

Running the suite several times reveals spurious failures on test 12 / 21:

[12484.258807] usbtest 3-6.1:1.0: TEST 14:  1000 ep0out, 1..1024 vary 512
[12484.922916] usbtest 3-6.1:1.0: ctrl_out write failed, code -32, count 442
...
[12491.113047] usbtest 3-6.1:1.0: TEST 21:  1000 ep0out odd addr, 1..1024 vary 512
[12491.625816] usbtest 3-6.1:1.0: ctrl_out write failed, code -32, count 344
[13563.560111] usbtest 3-6.1:1.0: TEST 14:  1000 ep0out, 1..1024 vary 512
[13564.176834] usbtest 3-6.1:1.0: ctrl_out write failed, code -32, count 468
nucleo_c071rb

Build command: west build -b nucleo_c071rb samples/subsys/usb/testusb -DCONFIG_LOG=n -DCONFIG_UDC_BUF_POOL_SIZE=8192 -DCONFIG_UDC_STM32_STACK_SIZE=4096 -DCONFIG_ASSERT=y -p
(no log, smaller pool size due to limited RAM)

./testusb: /dev/bus/usb/003/020 may see only control tests
full speed	/dev/bus/usb/003/020	0
running all tests
/dev/bus/usb/003/020 test 0,    0.000005 secs
/dev/bus/usb/003/020 test 1,    2.269195 secs
/dev/bus/usb/003/020 test 2,    1.819379 secs
/dev/bus/usb/003/020 test 3,    1.131299 secs
/dev/bus/usb/003/020 test 4,    0.976451 secs
/dev/bus/usb/003/020 test 5,   64.715321 secs
/dev/bus/usb/003/020 test 6,   58.187705 secs
/dev/bus/usb/003/020 test 7,   33.352789 secs
/dev/bus/usb/003/020 test 8,   30.106194 secs
/dev/bus/usb/003/020 test 9,    2.855364 secs
/dev/bus/usb/003/020 test 10,   11.392002 secs
/dev/bus/usb/003/020 test 11,    4.207496 secs
/dev/bus/usb/003/020 test 12,    4.219017 secs
/dev/bus/usb/003/020 test 13 --> 22 (error 22)
/dev/bus/usb/003/020 test 14,    2.172070 secs
/dev/bus/usb/003/020 test 17,    2.198096 secs
/dev/bus/usb/003/020 test 18,    1.819416 secs
/dev/bus/usb/003/020 test 19,    2.229379 secs
/dev/bus/usb/003/020 test 20,    1.818665 secs
/dev/bus/usb/003/020 test 21,    2.056613 secs
/dev/bus/usb/003/020 test 24,   65.960064 secs
/dev/bus/usb/003/020 test 27,   64.402275 secs
/dev/bus/usb/003/020 test 28,   58.168394 secs
/dev/bus/usb/003/020 test 29,    1.557576 secs
b_u585i_iot02a

Build command: west build -b b_u585i_iot02a samples/subsys/usb/testusb -DCONFIG_LOG_MODE_IMMEDIATE=y -DCONFIG_UDC_BUF_POOL_SIZE=16384 -DCONFIG_UDC_STM32_STACK_SIZE=4096 -DCONFIG_ASSERT=y -p

./testusb: /dev/bus/usb/003/022 may see only control tests
full speed	/dev/bus/usb/003/022	0
running all tests
/dev/bus/usb/003/022 test 0,    0.000004 secs
/dev/bus/usb/003/022 test 1,    1.061269 secs
/dev/bus/usb/003/022 test 2,    0.997339 secs
/dev/bus/usb/003/022 test 3,    0.562513 secs
/dev/bus/usb/003/022 test 4,    0.544952 secs
/dev/bus/usb/003/022 test 5,   32.312055 secs
/dev/bus/usb/003/022 test 6,   30.307170 secs
/dev/bus/usb/003/022 test 7,   17.064635 secs
/dev/bus/usb/003/022 test 8,   15.852394 secs
/dev/bus/usb/003/022 test 9,    1.635309 secs
/dev/bus/usb/003/022 test 10,    5.621458 secs
/dev/bus/usb/003/022 test 11,    4.100863 secs
/dev/bus/usb/003/022 test 12,    4.021411 secs
/dev/bus/usb/003/022 test 13,    4.761485 secs
/dev/bus/usb/003/022 test 14,    1.090158 secs
/dev/bus/usb/003/022 test 17,    1.080200 secs
/dev/bus/usb/003/022 test 18,    0.988265 secs
/dev/bus/usb/003/022 test 19,    1.042991 secs
/dev/bus/usb/003/022 test 20,    0.965299 secs
/dev/bus/usb/003/022 test 21,    1.100988 secs
/dev/bus/usb/003/022 test 24,   31.006012 secs
/dev/bus/usb/003/022 test 27,   32.000551 secs
/dev/bus/usb/003/022 test 28,   30.228987 secs
/dev/bus/usb/003/022 test 29,    0.598711 secs
nucleo_u5a5zj_q

Build command: west build -b nucleo_u5a5zj_q samples/subsys/usb/testusb -DCONFIG_LOG_MODE_IMMEDIATE=y -DCONFIG_UDC_BUF_POOL_SIZE=16384 -DCONFIG_UDC_STM32_STACK_SIZE=4096 -DCONFIG_ASSERT=y -p

Full-Speed (though maximum-speed = "full-speed" property):

/dev/bus/usb/003/025 test 0,    0.000006 secs
/dev/bus/usb/003/025 test 1,    1.043695 secs
/dev/bus/usb/003/025 test 2,    0.997514 secs
/dev/bus/usb/003/025 test 3,    0.591337 secs
/dev/bus/usb/003/025 test 4,    0.556922 secs
/dev/bus/usb/003/025 test 5,   32.179990 secs
/dev/bus/usb/003/025 test 6,   30.334854 secs
/dev/bus/usb/003/025 test 7,   16.755628 secs
/dev/bus/usb/003/025 test 8,   15.829828 secs
/dev/bus/usb/003/025 test 9,    1.557445 secs
/dev/bus/usb/003/025 test 10,    5.263062 secs
/dev/bus/usb/003/025 test 11,    4.262891 secs
/dev/bus/usb/003/025 test 12,    4.351788 secs
/dev/bus/usb/003/025 test 13,    4.505409 secs
/dev/bus/usb/003/025 test 14,    1.131665 secs
/dev/bus/usb/003/025 test 17,    1.082593 secs
/dev/bus/usb/003/025 test 18,    0.989057 secs
/dev/bus/usb/003/025 test 19,    1.065916 secs
/dev/bus/usb/003/025 test 20,    1.027083 secs
/dev/bus/usb/003/025 test 21,    1.271152 secs
/dev/bus/usb/003/025 test 24,   30.978110 secs
/dev/bus/usb/003/025 test 27,   31.999888 secs
/dev/bus/usb/003/025 test 28,   30.222459 secs
/dev/bus/usb/003/025 test 29,    0.540012 secs

High-Speed:

./testusb: /dev/bus/usb/003/035 may see only control tests
high speed	/dev/bus/usb/003/035	0
running all tests
/dev/bus/usb/003/035 test 0,    0.000004 secs
/dev/bus/usb/003/035 test 1,    0.125188 secs
/dev/bus/usb/003/035 test 2,    0.086212 secs
/dev/bus/usb/003/035 test 3,    0.090455 secs
/dev/bus/usb/003/035 test 4,    0.050221 secs
/dev/bus/usb/003/035 test 5,    4.426198 secs
/dev/bus/usb/003/035 test 6,    3.057157 secs
/dev/bus/usb/003/035 test 7,    2.366869 secs
/dev/bus/usb/003/035 test 8,    1.649636 secs
/dev/bus/usb/003/035 test 9,    0.709259 secs
/dev/bus/usb/003/035 test 10,    2.960046 secs
/dev/bus/usb/003/035 test 11,    4.374255 secs
/dev/bus/usb/003/035 test 12,    4.309335 secs
/dev/bus/usb/003/035 test 13 --> 22 (error 22)
/dev/bus/usb/003/035 test 14,    0.521218 secs
/dev/bus/usb/003/035 test 17,    0.130618 secs
/dev/bus/usb/003/035 test 18,    0.088897 secs
/dev/bus/usb/003/035 test 19,    0.128916 secs
/dev/bus/usb/003/035 test 20,    0.086687 secs
/dev/bus/usb/003/035 test 21,    0.522030 secs
/dev/bus/usb/003/035 test 24,    5.186775 secs
/dev/bus/usb/003/035 test 27,    4.344920 secs
/dev/bus/usb/003/035 test 28,    2.850130 secs
/dev/bus/usb/003/035 test 29,    0.379078 secs
stm32n6570_dk

Build command: west build -b stm32n6570_dk//fsbl samples/subsys/usb/testusb -DCONFIG_LOG_MODE_IMMEDIATE=y -DCONFIG_UDC_BUF_POOL_SIZE=16384 -DCONFIG_UDC_STM32_STACK_SIZE=4096 -DCONFIG_ASSERT=y -p

Full-Speed:

./testusb: /dev/bus/usb/003/031 may see only control tests
full speed	/dev/bus/usb/003/031	0
running all tests
/dev/bus/usb/003/031 test 0,    0.000005 secs
/dev/bus/usb/003/031 test 1,    1.161227 secs
/dev/bus/usb/003/031 test 2,    1.039223 secs
/dev/bus/usb/003/031 test 3,    0.624483 secs
/dev/bus/usb/003/031 test 4,    0.626709 secs
/dev/bus/usb/003/031 test 5,   32.708355 secs
/dev/bus/usb/003/031 test 6,   32.029393 secs
/dev/bus/usb/003/031 test 7,   17.132160 secs
/dev/bus/usb/003/031 test 8,   16.725253 secs
/dev/bus/usb/003/031 test 9,    1.735306 secs
/dev/bus/usb/003/031 test 10,    6.353471 secs
/dev/bus/usb/003/031 test 11,    4.142655 secs
/dev/bus/usb/003/031 test 12,    4.036989 secs
/dev/bus/usb/003/031 test 13,    4.793730 secs
/dev/bus/usb/003/031 test 14,    1.248639 secs
/dev/bus/usb/003/031 test 17,    1.155482 secs
/dev/bus/usb/003/031 test 18,    1.053566 secs
/dev/bus/usb/003/031 test 19,    1.147514 secs
/dev/bus/usb/003/031 test 20,    1.047552 secs
/dev/bus/usb/003/031 test 21,    1.315362 secs
/dev/bus/usb/003/031 test 24,   33.895504 secs
/dev/bus/usb/003/031 test 27,   32.000416 secs
/dev/bus/usb/003/031 test 28,   31.999989 secs
/dev/bus/usb/003/031 test 29,    0.646449 secs

High-Speed:

./testusb: /dev/bus/usb/003/040 may see only control tests
high speed	/dev/bus/usb/003/040	0
running all tests
/dev/bus/usb/003/040 test 0,    0.000005 secs
/dev/bus/usb/003/040 test 1,    0.334743 secs
/dev/bus/usb/003/040 test 2,    0.187334 secs
/dev/bus/usb/003/040 test 3,    0.170140 secs
/dev/bus/usb/003/040 test 4,    0.105109 secs
/dev/bus/usb/003/040 test 5,    8.010339 secs
/dev/bus/usb/003/040 test 6,    6.081255 secs
/dev/bus/usb/003/040 test 7,    4.324518 secs
/dev/bus/usb/003/040 test 8,    3.263021 secs
/dev/bus/usb/003/040 test 9,    1.010665 secs
/dev/bus/usb/003/040 test 10,    5.483524 secs
/dev/bus/usb/003/040 test 11,    4.258801 secs
/dev/bus/usb/003/040 test 12,    4.453187 secs
/dev/bus/usb/003/040 test 13 --> 22 (error 22)
/dev/bus/usb/003/040 test 14,    0.880071 secs
/dev/bus/usb/003/040 test 17,    0.315639 secs
/dev/bus/usb/003/040 test 18,    0.187566 secs
/dev/bus/usb/003/040 test 19,    0.347328 secs
/dev/bus/usb/003/040 test 20,    0.187235 secs
/dev/bus/usb/003/040 test 21,    0.886923 secs
/dev/bus/usb/003/040 test 24,   10.188895 secs
/dev/bus/usb/003/040 test 27,    8.045560 secs
/dev/bus/usb/003/040 test 28,    6.001192 secs
/dev/bus/usb/003/040 test 29,    0.659753 secs
stm32h747i_disco//m7

Full-Speed:

./testusb: /dev/bus/usb/003/034 may see only control tests
full speed	/dev/bus/usb/003/034	0
running all tests
/dev/bus/usb/003/034 test 0,    0.000005 secs
/dev/bus/usb/003/034 test 1,    1.630018 secs
/dev/bus/usb/003/034 test 2,    1.322259 secs
/dev/bus/usb/003/034 test 3,    0.844013 secs
/dev/bus/usb/003/034 test 4,    0.678005 secs
/dev/bus/usb/003/034 test 5,   46.451094 secs
/dev/bus/usb/003/034 test 6,   38.627336 secs
/dev/bus/usb/003/034 test 7,   24.174992 secs
/dev/bus/usb/003/034 test 8,   20.001984 secs
/dev/bus/usb/003/034 test 9,    1.650907 secs
/dev/bus/usb/003/034 test 10,    5.604758 secs
/dev/bus/usb/003/034 test 11,    8.153311 secs
/dev/bus/usb/003/034 test 12,    8.363027 secs
/dev/bus/usb/003/034 test 13,    6.848462 secs
/dev/bus/usb/003/034 test 14,    1.284452 secs
/dev/bus/usb/003/034 test 17,    1.677145 secs
/dev/bus/usb/003/034 test 18,    1.391497 secs
/dev/bus/usb/003/034 test 19,    1.671970 secs
/dev/bus/usb/003/034 test 20,    1.336728 secs
/dev/bus/usb/003/034 test 21,    1.366159 secs
/dev/bus/usb/003/034 test 24,   47.595362 secs
/dev/bus/usb/003/034 test 27,   46.178368 secs
/dev/bus/usb/003/034 test 28,   38.400977 secs
/dev/bus/usb/003/034 test 29,    0.768654 secs

High-Speed:

./testusb: /dev/bus/usb/003/035 may see only control tests
high speed	/dev/bus/usb/003/035	0
running all tests
/dev/bus/usb/003/035 test 0,    0.000004 secs
/dev/bus/usb/003/035 test 1,    0.125188 secs
/dev/bus/usb/003/035 test 2,    0.086212 secs
/dev/bus/usb/003/035 test 3,    0.090455 secs
/dev/bus/usb/003/035 test 4,    0.050221 secs
/dev/bus/usb/003/035 test 5,    4.426198 secs
/dev/bus/usb/003/035 test 6,    3.057157 secs
/dev/bus/usb/003/035 test 7,    2.366869 secs
/dev/bus/usb/003/035 test 8,    1.649636 secs
/dev/bus/usb/003/035 test 9,    0.709259 secs
/dev/bus/usb/003/035 test 10,    2.960046 secs
/dev/bus/usb/003/035 test 11,    4.374255 secs
/dev/bus/usb/003/035 test 12,    4.309335 secs
/dev/bus/usb/003/035 test 13 --> 22 (error 22)
/dev/bus/usb/003/035 test 14,    0.521218 secs
/dev/bus/usb/003/035 test 17,    0.130618 secs
/dev/bus/usb/003/035 test 18,    0.088897 secs
/dev/bus/usb/003/035 test 19,    0.128916 secs
/dev/bus/usb/003/035 test 20,    0.086687 secs
/dev/bus/usb/003/035 test 21,    0.522030 secs
/dev/bus/usb/003/035 test 24,    5.186775 secs
/dev/bus/usb/003/035 test 27,    4.344920 secs
/dev/bus/usb/003/035 test 28,    2.850130 secs
/dev/bus/usb/003/035 test 29,    0.379078 secs

Summary:

  • Test 13:
    • Failed on boards with st,stm32-usb or st,stm32-otghs running in HS mode
    • Passed on boards with st,stm32-otgfs or st,stm32-otghs running in FS mode
  • All other tests are passed
    • Tests 15/16 (io write tests/iso read tests) and 22/23 (unaligned iso tests) do not execute for some reason

I need to perform additional tests on nucleo_l552ze_q but otherwise there seems to be no regression ==> LGTM.

@cfriedt cfriedt merged commit dca6b87 into zephyrproject-rtos:main Oct 20, 2025
31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: USB Universal Serial Bus platform: STM32 ST Micro STM32

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants